package com.frame.framework.context.support;

import com.frame.framework.bean.factory.support.BeanDefinitionReader;
import com.frame.framework.bean.factory.support.BeanDefinitionRegistry;
import com.frame.framework.context.ApplicationContext;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

/**
 * @Description ApplicationContext 的子实现类, 用于立即加载
 * @Author Mokairui
 * @Since 2021/11/27
 */
public abstract class AbstractApplicationContext implements ApplicationContext {

    // 申明解析器变量
    protected BeanDefinitionReader beanDefinitionReader;

    // 定义用于存储 bean 对象的 map 容器
    protected Map<String, Object> singletonObjects = new HashMap<>();

    // 申明配置文件路径的变量
    protected String configLocation;

    @Override
    public void refresh() throws Exception {
        // 加载 BeanDefinition 对象
        beanDefinitionReader.loadBeanDefinitions(configLocation);
        // 初始化 bean
        finishBeanInitialization();
    }

    // bean 的初始化
    private void finishBeanInitialization() throws Exception {
        // 获取注册表对象
        BeanDefinitionRegistry registry = beanDefinitionReader.getRegistry();

        // 获取 BeanDefinition 对象
        String[] beanDefinitionNames = registry.getBeanDefinitionNames();
        for (String beanName : beanDefinitionNames) {
            // 进行 bean 的初始化
            getBean(beanName);
        }
    }
}
